perm filename NS1[F8,ALS] blob sn#321377 filedate 1977-12-15 generic text, type C, neo UTF8
COMMENT āŠ—   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	*CHECKERS FINAL REV of December 14 1977 0930 Hours
C00028 ENDMK
CāŠ—;
*CHECKERS FINAL REV of December 14 1977 0930 Hours
*Resident package addresses
JOYT    EQU  H'0C00'
LINE    EQU  H'0FDF'
SHCB    EQU  H'0FE2'
INPF    EQU  H'0FE3'
WTLN    EQU  H'0FE5'
TXC     EQU  H'0FE8'
CMRG    EQU  H'0FEA'
DBNC    EQU  H'0FEB'
UPI     EQU  H'0FFA'
JOYI    EQU  H'21AD'
IJS     EQU  H'22DB'
SHL     EQU  H'27C6'
SHR     EQU  H'27D3'
PUSH    EQU  H'40A9'
POPS    EQU  H'40BC'
SPS     EQU  H'40D0'
WDG     EQU  H'4105'
WAUD    EQU  H'41C8'
WAU1    EQU  H'41CC'
CDS     EQU  H'41D5'
WMS     EQU  H'4205'
UDAT    EQU  H'424D'
TRAN    EQU  H'43CD'
FCS     EQU  H'43D6'
WAIT    EQU  H'4501'
TIR     EQU  H'45DB'
SNE     EQU  H'46D6'
CLER    EQU  H'4762'
*Misc. constants
TCMD    EQU  H'44'
BCMD    EQU  H'6D'
TCOL    EQU  H'80'   TEXT COLOR
ULIN    EQU  H'FA'
COM     EQU  H'8F7'
*RAM assignments
BFLG    EQU  H'0C20' BUTTON EDGE FLAG
BLNF    EQU  H'0C21' Blink flag
XBLN    EQU  H'0C22' X value to blink
YBLN    EQU  H'0C23' Y value to blink
BCNT    EQU  H'0C24' Counter used in OKMV
BKMV    EQU  H'0C25' Data to index book moves
HSAV    EQU  H'0C26' H save location
PLY0    EQU  H'0C28' Place for player's ply depth choice
COL0    EQU  H'0C29' Place for color choice(next after PLY0)
SELX    EQU  H'0C2A' SELE exit (0 norm, 1 M's 1st, -1 P's 1st)
AP20    EQU  H'0C2C' ACTM+PASM+9 AT HL=20
XOLD    EQU  H'0C2D' XCOORD TOUCH POINT (DOUBLE JUMP)
YOLD    EQU  H'0C2E' YCOORD TOUCH POINT (DOUBLE JUMP)
CFLG    EQU  H'0C2F' COMPRESSION FLAG FOR PLY REC
OBJ0    EQU  H'0C30' Board 1, thru H'0E0F'
TREE    EQU  H'0E10' Tree data, thru H'0EFF', Player's board f
TRE2    EQU  H'0E20' Machine's first board here
TRE3    EQU  H'0E3E' PASSED FLAG AT LEVEL 30
TRE5    EQU  H'0E50' PLY 5 LOCATION
PLDJ    EQU  H'0E57' USED FOR TEMP STORE OF TOUCH POINT
PLMD    EQU  H'0E5B' Used for temp store of player's move inf
PLMV    EQU  H'0ED0' Overlay region used for player's moves
PLMF    EQU  H'0EE0' and move numbers
SCOR    EQU  H'0EF0' SCORE (HI:LO) 14 2 BYTE PAIRS
XPOS    EQU  H'0F0C' XPOSITION(CURSOR)
YPOS    EQU  H'0F0F' YPOSITION(CURSOR)
OBJ1    EQU  H'0F10' Board 2, thru H'0FAF'
MOBS    EQU  H'0FB0' Mobility (14 bytes)
RGSV    EQU  H'0FC8' Register save start (int. update)
*Scratch pad assignments
MAT     EQU  0       REGISTER USED FOR MATERIAL
POT     EQU  6       REGISTER USED FOR POSITION
HLS     EQU  H'4'  REG TO SAVE HL OFFSET
TEMP    EQU  H'8'
J       EQU  H'9'
HU      EQU  H'A'
HL      EQU  H'B'
PLOC    EQU  O'3'    LISU value for ACTIVE and PASSIVE
KLOC    EQU  O'4'    LISU value for KING's and special data
ELOC    EQU  O'5'    LISU value for EMPTY's area
ISA     EQU  O'30'   ISAR value for active area
ISP     EQU  O'34'   ISAR value for passive
ISK     EQU  O'40'   ISAR value for kings
ACTM    EQU  O'46'   ISAR VALUE FOR ACTIVE MATERIAL
PASM    EQU  O'47'   ISAR VALUE FOR PASSIVE MATERIAL
ISE     EQU  O'51'   ISAR value foempty (with offset)
*Mimimum ply depths
PLYT    EQU  H'FD'   Ply depth for Robot Tom (stored as neg.)
PLYD    EQU  H'FC'   Ply depth for Robot Dick
PLYH    EQU  H'FB'   Ply depth for Robot Harry
*SPECIAL CONSTANTS
MSK     EQU  H'1'    X ZOOM BIT MASK (CMRG)
X       EQU  H'1'
Y       EQU  H'2'
VX      EQU  H'3'
VY      EQU  H'4'
CHT     EQU  H'3'    CURSOR HEIGHT
YTST    EQU  H'9'
XZOP    EQU  H'34'   LINE FOR RESTORE OF X ZOOM
MAXY    EQU  H'4D'   MAX Y COORD (=H'4F'-CHT)
*Linkage locations
        ORG  H'1000' Initial operations and questions
        DC   H'AA'
        DC   H'55'
        DC   H'01'   BACKGROUND COLOR
        DC   H'00'   BACKGROUND COLOR
        DC   H'00'   SPACES
        DC   H'00'   SPACES
        DC   H'3119' CH
        DC   H'0B31' EC
        DC   H'150B' KE
        DC   H'0921' RS
        DC   H'00'   -
        DC   H'00'   -
        DC   H'00'   -
        DC   H'00'   -
*-*-
        PI   CDS     CLEAR DISPLAY
        PI   IJS     INITIALIZE JOYSTICK TABLE
        LISU 2       For safety only, can be removed later
        LISL 6
        CLR
        XS   S
        BM   QN1     Is clock running?
        LI   H'81'   No, so start it
        LR   D,A
        LIS  2
        LR   S,A
*-*-*-*- Initial question session
QN1     LIS  H'4'
        LR   0,A
        PI   SEDC    SET MESSAGE LNGTH&LINE POINTER
        DS   1       DEFAULT PLY=H'FD'
        DS   1
        DS   1       SET DEFAULT PLY DEPTH
        DCI  SKL
        PI   WMS     WRITE MESSAGE
        PI   RKB     AND DO KEYBOARD READ
        CI   H'2B'
        BZ   QN10    IS IT 'NIALL'?
        CI   H'11'   NO.
        BNZ  QN11    IF NOT 'ARTHUR', THEN 'DAVE'
        DS   1
QN10    DS   1
QN11    DCI  PLY0
        LR   A,1     GET CORRECT PLY DEPTH
        ST           AND SAVE IT.
        DS   0
        DS   0       SET FOR BUT TWO LINES
        PI   CDS     CLEAR DISPLAY
        PI   SEDC    SET LINE POINTER
        LIS  H'5'
        COM
        AS   S
        LR   S,A     SET FOR BUT H'1A' LENGTH
        DCI  YMF     DCO TO MESSAGE START
        PI   WMS     SO WRITE MESSAGE
        PI   RKB     READ KEYBOARD
        CI   H'2B'   Is answer an N?
        DCI  COL0
        CLR
        LR   7,A     Black plays first always
        BZ   QN13    N means machine first
        COM
        ST           COL0<=-1, player is black
        COM
        ST           SELX<=??, player first
        BR   QN14
QN13    ST           COL0<=0, machine is black
        ST           SELX<=??, machine first
QN14    DCI  BLKM    TABLE OF POSSIBLE MOVES
        XDC
        DCI  PLMV    List to verify moves
        LIS  H'7'
        LISU 2
        LISL 0
        LR   S,A     SET TRANSFER COUNT
        PI   TRAN    DO TRANSFER
        DCI  BKMV
        CLR
        ST           Clear Book move index value
        DCI  CMRG
        LI   H'65'
        ST           SET FOR X & Y ZOOM
        PI   CLER    CLER UM1 REGISTERS
        DCI  UPI     DCO TO UPDATE CONTROLS
        LIS  H'3'
        ST           SET INTO COUNT
        CLR
        ST           SET FOR FULL INIT
        LI   INIT:
        ST
        LI   INIT.
        ST           AND SET ADDRESS
        PI   WAUD    WAIT, THEN UPDATE
        LIS  H'5'
        LR   S,A     GET TRANSFER COUNT
        DCI  BDAT    SET SOURCE
        XDC          INTO DC1
        DCI  UPI+1   DESTINATION
        PI   TRAN    TRANSFER DATA
        PI   WAUD    WAIT, DO UPDATE, RESET ISAR&RET.
        PI   ENIN    NOW ENABLE INTERRUPT
*-*-*- Load SC for initial board
        LISU PLOC    LOAD SCRATCHPAD AS
        LISL 7       FOLLOWS:
        CLR
BRDJ    LR   D,A     O'30'=FF
        BR7  BRDJ    O'31'=F0
        COM          O'32'=0
        LR   I,A     O'33'=0
        LR   I,A     O'34'=0
        SL   4       O'35'=0
        LR   I,A     O'36'=F
        LISL 6       O'37'=FF
        LIS  H'F'
        LR   I,A
        LISU KLOC
        LISL H'7'
        CLR
BRDK    LR   D,A     O'40' thru O'47' = 0
        BR7  BRDK
        LI   H'18'   SET PASSIVE AND ACTIVE MATERIAL
        LR   D,A     COUNTS TO H'18'=D'24' INITIALLY
        LR   D,A
        DCI  TRE2
        PI   SCRD    SR to RAM for machine's first move
        DCI  TREE
        PI   SCRD    SR to RAM for player's first move
        PI   BORD    Generate board image with men
        DCI  XPOS
        LIS  H'0'
        ST           SET FOR LEFT MOST
        LIS  H'3'
        ST
        LIS  H'0'
        ST
        DCI  YPOS
        ST           AND SET FOR TOPMOST
*-*-*-*-*-*-*-*-*-*- Start play
        DCI  H'8F5'
        CLR
        ST           SET BACKGROUND BLACK
        DCI  COL0
        CLR
        XM
        BM   PMOV    Player chose Black
*-*-*- Machine's first move if playing black
        LISU 2
        LISL 5
        LIS  H'7'    Used as random number
        NS   S       Save last 3 bits
        LR   0,A     Use this number to select move
        DCI  BKMV    Book move index
        SL   4       Save space for second move
        SR   1
        ST           Record first move
        DCI  PLMV
QN17    LM           Get byte record
        LR   1,A
QN18    LR   A,1
        NS   1
        BNZ  QN19    Is this byte exhausted?
        LM           Step over byte info
        BR   QN17    Go to next byte record
QN19    LR   2,A
        AI   H'FF'   Subtract 1
        NS   1
        LR   1,A     byte less rightmost bit
        XS   2       This leaves 1 bit in A
        DS   0
        BP   QN18
        LR   6,A     Save the byte bit
        LM           Get the byte info
        LR   4,A     The byte indicator
        DCI  TRE2    Machine's board is here
        LR   H,DC
        LIS  H'C'
        ADC
        LR   A,6
        ST
        LR   A,4
        ST
        JMP  SELE    Go to SELE to make move
*
*Player's move
*
PMOV    PI   MWAD    Wait, then update
        PI   MVC     Initiate cursor
        DCI  TREE    Player's board is here
        LR   H,DC
MES0    CLR          "YOUR MOVE"
MES1    LR   0,A     Identify message
        PI   WMC     Write message
        DCI  BLNF
        CLR
        ST
CUR1    PI   CURS    Initiate cursor
*-*- Now X in 1, Y in 2, byte in 3 and byte # in 4
OKPI    DCI  PLMV    Possible moves listing
OKP1    CLR
        XM
        BNZ  OKP3    An entry found
        LR   A,5     Byte info
        NI   H'10'   Extract J bit
        LIS  H'5'    "PIECE CAN'T MOVE"
        BZ   OKP2
        LIS  H'1'    "MUST JUMP"
OKP2    BR   MES1    Try again
OKP3    NS   3       Compare
        BNZ  OKP4    This might be the one
        LM           A cheap way to index
        LR   5,A     Save for jump info
        BR   OKP1    Try again
OKP4    LM           Next entry is the byte info
        LR   5,A     Save it
        SR   1
        SR   1
        NI   H'3'    Remove the J bit and the direction
        XS   4       Does it match?
        BNZ  OKP1    Try again
        DCI  PLMD    Save data as to starting square
        LR   A,1     X
        ST
        LR   A,2     Y
        ST
        LR   A,3     BYTE
        ST
        LR   A,4     Byte info
        ST
        LIS  H'3'
        COM
        DCI  BCNT    Counter
        ST
        DCI  BLNF    Blink flag
        LIS  H'1'    Set on
        ST
        LR   A,1     Save X value
        ST           in XBLN
        LR   A,2     Save Y value
        ST           in YBLN
CUR2    PI   CURS
        DCI  PLDJ    STORE POSSIBLE TOUCH POINT
        LR   A,1
        ST
        LR   A,2
        ST
        LR   A,3
        ST
        LR   A,4
        ST
        DCI  PLMD+2  Restore initial values
        LM
        LR   3,A     for BYTE
        LM
        LR   4,A     and BYTE number
*Now test indicated move for legality
OKMV    DCI  PLMD    Saved data location
        LM           Get the old X value
        COM
        INC
        AS   1       This gives us the change in X
        BNZ  OKM01
        JMP  NON2    ILLEGAL
OKM01   LR   1,A     Save the difference
        BP   OKM1
        COM
        INC
OKM1    LR   0,A     |X|
        CI   H'2'
        BP   OKM02
        JMP  NON3    TOO FAR
OKM02   CLR          Anticipate normal move
        BNZ  OKM2
        LI   H'10'   Set Jump bit
OKM2    LR   6,A     save byte info here
        LM           Get the old Y value
        COM
        INC
        AS   2
        LR   2,A     Change in Y
        BM   OKM3
        COM
        INC
OKM3    AS   0
        BNZ  NON2    |X||Y|
        LR   A,2
        NS   2
        BP   OKM4
        LIS  H'2'    Backward bit
        AS   6
        LR   6,A
OKM4    LR   A,1
        NS   1
        BM   OKM5
        LIS  H'1'    Left bit
        AS   6
        LR   6,A
OKM5    LR   A,4     Get initial Byte #
        SL   1       Shift it left to position
        SL   1
        AS   6       Add in the J and Direction bits
        LR   6,A     Final byte info from cursor
        DCI  PLMV    Possible moves listing
        LIS  H'8'    7 moves possible
        LR   0,A
OKM6    CLR
        XM
        BZ   NONO    No more entries
        LR   1,A
        LM
        LR   5,A     Save byte info
OKM7    CLR
        XS   1
        BZ   OKM6    Last bit tested
        LR   2,A     We'll need it again
        AI   H'FF'   Subtract 1
        NS   1
        LR   1,A     Byte with bit removed
        XS   2       Get extracted bit
        DS   0       Count tries
        NS   3       Does it check with 3
        BZ   OKM7    Not in table entry, try again
        LR   A,5     But does byte info agree?
        XS   6       Compare 6 with table value
        BNZ  OKM7    No so count remaining bits in 1
        LIS  H'7'    Found, so reorder count
        XS   0       order from 0 thru 6
        DCI  BKMV
        ST           Save move count for book move entry
        PI   MWAD    DO MY WAIT THEN UPDATE
        PI   MVC     Turn off cursor
        PI   ENIN    NOW ENABLE INTERRUPT
        DCI  TREE    Store final values
        LR   H,DC
        LIS  H'C'
        ADC
        LR   A,3
        ST           Store byte
        LR   A,6
        ST           And byte info
*Before going to SELE, we want to
*set the BLINK coordinates to
*match the "CURRENT" position
        DCI  XBLN    DESTINATION
        XDC          SAVE IN DC1
        DCI  XOLD    DCO TO XPOSITION
        LM           GET SAME
        XDC          GET DESTINATION
        ST           AND SET SAME
        XDC          SAVE NEW DESTINATION
        LM           GET OLD Y POSITION
        XDC
        ST           AND RESET TO BLINK THERE
        DCI  BLNF    DCO TO BLINK FLAG
        LIS  H'1'
        ST           SET FOR BLINK
        JMP  SELE
NONO    LR   A,5
        NI   H'10'   A jump required?
        LIS  H'2'
        BZ   NON4
        LIS  H'1'
        BR   NON4
NON2    LIS  H'2'
        BR   NON4
NON3    LIS  H'3'
NON4    LR   0,A
        DCI  BCNT
        LM
        INC
        DCI  BCNT
        ST
        BM   NON5
        JMP  MES0
NON5    PI   WMC
        JMP  CUR2
DJMP    DCI  BCNT    SET COUNTER FOR
        LI   H'82'   LARGE NUMBER OF
        ST           TRIALS
        DCI  PLMD
        XDC
        DCI  PLDJ
        LIS  H'4'
        LR   0,A
DJMP1   LM           GET OLD TOUCH POINT DATA
        XDC
        ST           AND TRANSFER TO PLMD
        XDC
        DS   0       DECREMENT COUNT
        BNZ  DJMP1   DONE ENOUGH TRANSFER?
        PI   MWAD    DO MY WAIT, THEN UPDATE
        PI   MVC     TURN CURSOR ON
        LIS  H'6'
        LR   0,A     SET FOR "CONTINUE JUMP" MESSAGE
        BR   NON5    AND DISPLAY SAME
*-*-*- Message writing, uses R0, 1, SC O'24'
* calls UPDATE routine. Message # in 0.
WMC     LR   K,P     SAVE RETURN ADDRESS
        PI   PUSH    PUSH ONTO STACK
        DCI  H'872'
        LI   H'82'
        ST           TURN MESSAGE OBJECT OFF...
        DCI  HSAV
        LR   A,HU
        ST
        LR   A,HL
        ST
        PI   MWAD    WAIT, THEN UPDATE
        DCI  WMCA    DCO TO MESSAGE ADDRESS START
        LR   A,0     GET MESSAGE NUMBER
        SL   1
        AS   0
        ADC          ADD 3XNUMBER TO DCO
        LISU 2
        LISL 4       SET ISAR TO O'24'
        LM
        LR   S,A     SET MESSAGE LENGTH
        LM
        LR   QU,A
        LM
        LR   QL,A    MESSAGE ADDRESS INTO Q
        DCI  LINE
        LIS  H'5'
        SL   4
        ST           SET PROPER LINE NUMBER
        DCI  H'0E5F' DCO TO MESSAGE BUILD AREA
        LIS  H'7'
        SL   4
        LR   1,A     SET COUNTER
        CLR          CLEAR ACC
WMC1    ST
        DS   1
        BNZ  WMC1    CLEAR TEXT AREA
        PI   WAUD    WAIT, THEN DO UPDATE
        DCI  H'872'
        LIS  H'2'
        ST           TURN OBJECT ON
        LR   DC,Q    SET ADDRESS INTO DCO
        PI   WMS     WRITE MESSAGE
        PI   MWAD    WAIT, THEN UPDATE
        DCI  HSAV
        LM
        LR   HU,A
        LM
        LR   HL,A
        PI   ENIN    ENABLE INTERRUPTS ONCE MORE
        PI   POPS    POP RETURN ADDRESS
        PK           AND RETURN
*-*-*-*-*-*-*-*-*-*
* DATA FOR WMC